package com.example.demo.se;

/**
 * @ClassName StringTest
 * @Author bsy
 * @Description String类型
 * 1、==：既可以比较基本数据类型，又可以比较引用数据类型。基本数据类型比较的是值，引用数据类型比较的是地址。
 * <p>
 * equals只能比较引用数据类型，如果没有重写Object类中的equals方法,equals方法和==号比较引用数据类型无区别   ,重写后的equals方法比较的是对象中的属性。
 * <p>
 * 2.字符串常量存储在常量池，而new String 创建对象，在编译期间不能确定具体的值，所以会在 在在内存中创建的一个地址。 所以下面的第三题用等号比较的两个地址不同，但是属性是相同的，所以用equals比较的是属性值，所以相同。
 *
 * 3：总结： equals一定 == ，但是  ==不一定 equals
 *
 * 4、参考地址： https://blog.csdn.net/chaobin6/article/details/81214980
 *
 * @Date 2022/2/13 9:23
 * @Version 1.0
 */
public class StringTest {

    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");   //两个对象 ：abc在常量池，有自己的地址。 new String 创建对象，在编译期间不能确定具体的值，所以会在 在在内存中创建的一个地址。
        String s4 = "a" + "b" + "c";
        String s5 = "ab";
        String s6 = s5 + "c";
        String s7 = s2;

        System.out.println(s1 == s2); //ture
        System.out.println(s1.equals(s2));  //true，equals中，先判断两个对象的地址值，地址值相同，默认就是同一个对象，不会继续equalse中的具体值是否相等的判断了，直接会返回true

        System.out.println(s1 == s3); //false
        System.out.println(s1.equals(s3)); //ture,重写Object  equals(),比内容

        System.out.println(s1 == s4); // true
        System.out.println(s1.equals(s4)); //true
        System.out.println(s3.equals(s4)); //true  本质都是常量池

        System.out.println(s1.equals(s6));//true

        System.out.println(s1.equals(s7));//true

        System.out.println(s3 == s7);//false


    }
}
